﻿using System.Collections;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace Aierp.Utility
{
    public class HttpMethods
    {
        #region POST
        /// <summary>
        /// HTTP POST方式请求数据
        /// </summary>
        /// <param name="url">URL.</param>
        /// <param name="param">POST的数据</param>
        /// <returns></returns>
        public static string HttpPost(string url, string param = null)
        {
            //HttpWebRequest request;

            ////如果是发送HTTPS请求  
            //if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            //{
            //    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            //    request = WebRequest.Create(url) as HttpWebRequest;
            //    request.ProtocolVersion = HttpVersion.Version10;
            //}
            //else
            //{
            //    request = WebRequest.Create(url) as HttpWebRequest;
            //}

            //request.Method = "POST";
            //request.ContentType = "application/x-www-form-urlencoded";
            //request.Accept = "*/*";
            //request.Timeout = 15000;
            //request.AllowAutoRedirect = false;



            //StreamWriter requestStream = null;
            //WebResponse response = null;
            //string responseStr = null;

            //try
            //{
            //    requestStream = new StreamWriter(request.GetRequestStream());
            //    requestStream.Write(param);
            //    requestStream.Close();

            //    response = request.GetResponse();
            //    if (response != null)
            //    {
            //        StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            //        responseStr = reader.ReadToEnd();
            //        reader.Close();
            //    }
            //}
            //catch (Exception)
            //{
            //    throw;
            //}
            //finally
            //{
            //    request = null;
            //    requestStream = null;
            //    response = null;
            //}

            //return responseStr;
            return null;
        }


        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true; //总是接受  
        }
        public static string BuildRequest(string strUrl, Dictionary<string, string> dicPara, string fileName)
        {
            //string contentType = "image/jpeg";
            ////待请求参数数组
            //FileStream Pic = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            //byte[] PicByte = new byte[Pic.Length];
            //Pic.Read(PicByte, 0, PicByte.Length);
            //int lengthFile = PicByte.Length;

            ////构造请求地址

            ////设置HttpWebRequest基本信息
            //HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl);
            ////设置请求方式：get、post
            //request.Method = "POST";
            ////设置boundaryValue
            //string boundaryValue = DateTime.Now.Ticks.ToString("x");
            //string boundary = "--" + boundaryValue;
            //request.ContentType = "\r\nmultipart/form-data; boundary=" + boundaryValue;
            ////设置KeepAlive
            //request.KeepAlive = true;
            ////设置请求数据，拼接成字符串
            //StringBuilder sbHtml = new StringBuilder();
            //foreach (KeyValuePair<string, string> key in dicPara)
            //{
            //    sbHtml.Append(boundary + "\r\nContent-Disposition: form-data; name=\"" + key.Key + "\"\r\n\r\n" + key.Value + "\r\n");
            //}
            //sbHtml.Append(boundary + "\r\nContent-Disposition: form-data; name=\"pic\"; filename=\"");
            //sbHtml.Append(fileName);
            //sbHtml.Append("\"\r\nContent-Type: " + contentType + "\r\n\r\n");
            //string postHeader = sbHtml.ToString();
            ////将请求数据字符串类型根据编码格式转换成字节流
            //Encoding code = Encoding.GetEncoding("UTF-8");
            //byte[] postHeaderBytes = code.GetBytes(postHeader);
            //byte[] boundayBytes = Encoding.ASCII.GetBytes("\r\n" + boundary + "--\r\n");
            ////设置长度
            //long length = postHeaderBytes.Length + lengthFile + boundayBytes.Length;
            //request.ContentLength = length;

            ////请求远程HTTP
            //Stream requestStream = request.GetRequestStream();
            //Stream myStream = null;
            //try
            //{
            //    //发送数据请求服务器
            //    requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
            //    requestStream.Write(PicByte, 0, lengthFile);
            //    requestStream.Write(boundayBytes, 0, boundayBytes.Length);
            //    HttpWebResponse HttpWResp = (HttpWebResponse)request.GetResponse();
            //    myStream = HttpWResp.GetResponseStream();
            //}
            //catch (WebException e)
            //{
            //    //LogResult(e.Message);
            //    return "";
            //}
            //finally
            //{
            //    if (requestStream != null)
            //    {
            //        requestStream.Close();
            //    }
            //}

            ////读取处理结果
            //StreamReader reader = new StreamReader(myStream, code);
            //StringBuilder responseData = new StringBuilder();

            //String line;
            //while ((line = reader.ReadLine()) != null)
            //{
            //    responseData.Append(line);
            //}
            //myStream.Close();
            //Pic.Close();

            //return responseData.ToString();
            return "";
        }
        #endregion

        #region Put
        /// <summary>
        /// HTTP Put方式请求数据.
        /// </summary>
        /// <param name="url">URL.</param>
        /// <returns></returns>
        public static string HttpPut(string url, string param = null)
        {
            //HttpWebRequest request;

            ////如果是发送HTTPS请求  
            //if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            //{
            //    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            //    request = WebRequest.Create(url) as HttpWebRequest;
            //    request.ProtocolVersion = HttpVersion.Version10;
            //}
            //else
            //{
            //    request = WebRequest.Create(url) as HttpWebRequest;
            //}
            //request.Method = "PUT";
            //request.ContentType = "application/x-www-form-urlencoded";
            //request.Accept = "*/*";
            //request.Timeout = 15000;
            //request.AllowAutoRedirect = false;

            //StreamWriter requestStream = null;
            //WebResponse response = null;
            //string responseStr = null;

            //try
            //{
            //    requestStream = new StreamWriter(request.GetRequestStream());
            //    requestStream.Write(param);
            //    requestStream.Close();

            //    response = request.GetResponse();
            //    if (response != null)
            //    {
            //        StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            //        responseStr = reader.ReadToEnd();
            //        reader.Close();
            //    }
            //}
            //catch (Exception)
            //{
            //    throw;
            //}
            //finally
            //{
            //    request = null;
            //    requestStream = null;
            //    response = null;
            //}

            //return responseStr;
            return "";
        }
        #endregion

        #region Delete
        /// <summary>
        /// HTTP Delete方式请求数据.
        /// </summary>
        /// <param name="url">URL.</param>
        /// <returns></returns>
        public static string HttpDelete(string url, string param = null)
        {
            //HttpWebRequest request;

            ////如果是发送HTTPS请求  
            //if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            //{
            //    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            //    request = WebRequest.Create(url) as HttpWebRequest;
            //    request.ProtocolVersion = HttpVersion.Version10;
            //}
            //else
            //{
            //    request = WebRequest.Create(url) as HttpWebRequest;
            //}
            //request.Method = "Delete";
            //request.ContentType = "application/x-www-form-urlencoded";
            //request.Accept = "*/*";
            //request.Timeout = 15000;
            //request.AllowAutoRedirect = false;

            //StreamWriter requestStream = null;
            //WebResponse response = null;
            //string responseStr = null;

            //try
            //{
            //    requestStream = new StreamWriter(request.GetRequestStream());
            //    requestStream.Write(param);
            //    requestStream.Close();

            //    response = request.GetResponse();
            //    if (response != null)
            //    {
            //        StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            //        responseStr = reader.ReadToEnd();
            //        reader.Close();
            //    }
            //}
            //catch (Exception)
            //{
            //    throw;
            //}
            //return responseStr;
            return "";
        }
        #endregion

        #region Get
        /// <summary>
        /// HTTP GET方式请求数据.
        /// </summary>
        /// <param name="url">URL.</param>
        /// <returns></returns>
        public static string HttpGet(string url, Hashtable headht = null)
        {
            //HttpWebRequest request;

            ////如果是发送HTTPS请求  
            //if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            //{
            //    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            //    request = WebRequest.Create(url) as HttpWebRequest;
            //    request.ProtocolVersion = HttpVersion.Version10;
            //}
            //else
            //{
            //    request = WebRequest.Create(url) as HttpWebRequest;
            //}
            //request.Method = "GET";
            ////request.ContentType = "application/x-www-form-urlencoded";
            //request.Accept = "*/*";
            //request.Timeout = 15000;
            //request.AllowAutoRedirect = false;
            //WebResponse response = null;
            //string responseStr = null;
            //if (headht != null)
            //{
            //    foreach (DictionaryEntry item in headht)
            //    {
            //        request.Headers.Add(item.Key.ToString(), item.Value.ToString());
            //    }
            //}

            //try
            //{
            //    response = request.GetResponse();

            //    if (response != null)
            //    {
            //        StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            //        responseStr = reader.ReadToEnd();
            //        reader.Close();
            //    }
            //}
            //catch (Exception)
            //{
            //    throw;
            //}
            //return responseStr;
            return "";
        }
        public static string HttpGet(string url, Encoding encodeing, Hashtable headht = null)
        {
            //HttpWebRequest request;

            ////如果是发送HTTPS请求  
            //if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            //{
            //    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            //    request = WebRequest.Create(url) as HttpWebRequest;
            //    request.ProtocolVersion = HttpVersion.Version10;
            //}
            //else
            //{
            //    request = WebRequest.Create(url) as HttpWebRequest;
            //}
            //request.Method = "GET";
            ////request.ContentType = "application/x-www-form-urlencoded";
            //request.Accept = "*/*";
            //request.Timeout = 15000;
            //request.AllowAutoRedirect = false;
            //WebResponse response = null;
            //string responseStr = null;
            //if (headht != null)
            //{
            //    foreach (DictionaryEntry item in headht)
            //    {
            //        request.Headers.Add(item.Key.ToString(), item.Value.ToString());
            //    }
            //}

            //try
            //{
            //    response = request.GetResponse();

            //    if (response != null)
            //    {
            //        StreamReader reader = new StreamReader(response.GetResponseStream(), encodeing);
            //        responseStr = reader.ReadToEnd();
            //        reader.Close();
            //    }
            //}
            //catch (Exception)
            //{
            //    throw;
            //}
            //return responseStr;
            return "";
        }
        #endregion

        #region Post With Pic
        private string HttpPost(string url, IDictionary<object, object> param, string filePath)
        {
            //string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
            //byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

            //HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
            //wr.ContentType = "multipart/form-data; boundary=" + boundary;
            //wr.Method = "POST";
            //wr.KeepAlive = true;
            //wr.Credentials = System.Net.CredentialCache.DefaultCredentials;

            //Stream rs = wr.GetRequestStream();
            //string responseStr = null;

            //string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
            //foreach (string key in param.Keys)
            //{
            //    rs.Write(boundarybytes, 0, boundarybytes.Length);
            //    string formitem = string.Format(formdataTemplate, key, param[key]);
            //    byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
            //    rs.Write(formitembytes, 0, formitembytes.Length);
            //}
            //rs.Write(boundarybytes, 0, boundarybytes.Length);

            //string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
            //string header = string.Format(headerTemplate, "pic", filePath, "text/plain");
            //byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
            //rs.Write(headerbytes, 0, headerbytes.Length);

            //FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            //byte[] buffer = new byte[4096];
            //int bytesRead = 0;
            //while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            //{
            //    rs.Write(buffer, 0, bytesRead);
            //}
            //fileStream.Close();

            //byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
            //rs.Write(trailer, 0, trailer.Length);
            //rs.Close();

            //WebResponse wresp = null;
            //try
            //{
            //    wresp = wr.GetResponse();
            //    Stream stream2 = wresp.GetResponseStream();
            //    StreamReader reader2 = new StreamReader(stream2);
            //    responseStr = reader2.ReadToEnd();
            //    //logger.Debug(string.Format("File uploaded, server response is: {0}", responseStr));
            //}
            //catch (Exception ex)
            //{
            //    //logger.Error("Error uploading file", ex);
            //    if (wresp != null)
            //    {
            //        wresp.Close();
            //        wresp = null;
            //    }
            //    throw;
            //}
            //return responseStr;
            return "";
        }
        #endregion

        #region Post With Pic
        /// <summary>
        /// HTTP POST方式请求数据(带图片)
        /// </summary>
        /// <param name="url">URL</param>        
        /// <param name="param">POST的数据</param>
        /// <param name="fileByte">图片</param>
        /// <returns></returns>
        public static string HttpPost(string url, IDictionary<object, object> param, byte[] fileByte)
        {
            //string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
            //byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

            //HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
            //wr.ContentType = "multipart/form-data; boundary=" + boundary;
            //wr.Method = "POST";
            //wr.KeepAlive = true;
            //wr.Credentials = System.Net.CredentialCache.DefaultCredentials;

            //Stream rs = wr.GetRequestStream();
            //string responseStr = null;

            //string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
            //foreach (string key in param.Keys)
            //{
            //    rs.Write(boundarybytes, 0, boundarybytes.Length);
            //    string formitem = string.Format(formdataTemplate, key, param[key]);
            //    byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
            //    rs.Write(formitembytes, 0, formitembytes.Length);
            //}
            //rs.Write(boundarybytes, 0, boundarybytes.Length);

            //string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
            //string header = string.Format(headerTemplate, "pic", fileByte, "text/plain");//image/jpeg
            //byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
            //rs.Write(headerbytes, 0, headerbytes.Length);

            //rs.Write(fileByte, 0, fileByte.Length);

            //byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
            //rs.Write(trailer, 0, trailer.Length);
            //rs.Close();

            //WebResponse wresp = null;
            //try
            //{
            //    wresp = wr.GetResponse();
            //    Stream stream2 = wresp.GetResponseStream();
            //    StreamReader reader2 = new StreamReader(stream2);
            //    responseStr = reader2.ReadToEnd();
            //    // logger.Error(string.Format("File uploaded, server response is: {0}", responseStr));
            //}
            //catch (Exception ex)
            //{
            //    //logger.Error("Error uploading file", ex);
            //    if (wresp != null)
            //    {
            //        wresp.Close();
            //        wresp = null;
            //    }
            //    throw;
            //}
            //return responseStr;
            return "";
        }
        #endregion

        #region HttpsClient
        /// <summary>
        /// 创建HttpClient
        /// </summary>
        /// <returns></returns>
        public static HttpClient CreateHttpClient(string url)
        {
            //HttpClient httpclient;
            ////如果是发送HTTPS请求  
            //if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            //{
            //    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
            //    httpclient = new HttpClient();
            //}
            //else
            //{
            //    httpclient = new HttpClient();
            //}
            //return httpclient;
            return null;
        }
        #endregion
    }
}
